class Solution {
    void split(stack<char> &s)
    {
        stack<char> tmp;
        while(s.top() != '[')
        {
            tmp.push(s.top());
            s.pop();
        }
        s.pop();    // pop()掉原始栈中的'['

        while(!s.empty() && (s.top() >= '0' && s.top() <= '9'))
        {
            tmp.push(s.top());
            s.pop();
        }

        string str;
        while(!tmp.empty())
        {
            str += tmp.top();
            tmp.pop();
        }

        // 走到这，str中就是数字+字母，例如32bc这样，下面做的就是分割

        string num;
        string character;
        string res;

        for(int i = 0; i < str.size(); i++)
        {
            if(!isalpha(str[i]))
                num += str[i];
            else
                character += str[i];
        }

        for(int i = 0; i < atoi(num.c_str()); i++)
            res += character;

        for(int i = 0; i < res.size(); i++)
            s.push(res[i]);
    }

public:
    string decodeString(string s) {
        stack<char> st;
        int n = s.size();

        for(int i = 0; i < n; i++)
        {
            // 遇到']'，则进行解码，解码后的结果仍然push进栈
            if(s[i] == ']')
                split(st);
            else 
                st.push(s[i]);
        }

        string ans;
        while(!st.empty())
        {
            ans += st.top();
            st.pop();
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};